<?php
class Student
{
    public $name;
    protected $age;
    private $sex;

    public function __construct($name , $age , $sex)
    {
        $this->setName($name);
        $this->setAge($age);
        $this->setSex($sex);
    }

    public function setName($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }

    protected function setAge($age)
    {
        $this->age = $age;
    }

    private function setSex($sex)
    {
        $this->sex = $sex;
    }
}
//方法1，实例化后传入对象到 ReflectionClass
//$obj = new  Student('张三' ,'33 ,' ,0);
//$class = new ReflectionClass($obj);

//方法2 直接传类名到 ReflectionClass
$class = new ReflectionClass('Student');
//$instance = $class->newInstanceArgs([
//    '张三' ,'33 ,' ,0
//]);
//$instance = $class->newInstance('张三' ,'33 ,' ,0);

//两种方法等同于 $instance = new Student('张三' ,'33 ,' ,0)

//执行他的方法
//$res = $instance->getName();
//var_dump($res);

//var_dump类的所有属性和方法
//$res = ReflectionClass::export('Student');
//var_dump($res);
//$res = $class::export('Student');
//var_dump($res);
//$res = $class->getConstructor();
//var_dump($res);

//返回指定常量
//$res = $class->getConstant('aaa');


//返回所有定义过的常量
//$res = $class->getConstants();


//反射了类的构造函数
//$res = $class->getConstructor ();

//获取指定属性,包括private的
//$res = $class->getProperty('name');
//$res = $res->getName();


//获取所有属性,包括private的
//$res = $class->getProperties();

//获取文档注释
//$res = $class->getDocComment();

// 获取最后一行的行数
//$res = $class->getEndLine();

// 获取起始的行号
//$res = $class->getStartLine();

// 获取类被定义的文件的文件名。
//$res = $class->getFileName ();

// 获取类名
//$res = $class->getName ();

// 获取方法的数组
// ReflectionMethod::IS_PUBLIC 、 ReflectionMethod::IS_PROTECTED 、 ReflectionMethod::IS_PRIVATE 、 ReflectionMethod::IS_ABSTRACT 、 ReflectionMethod::IS_FINAL 的任意组合。
//$res = $class->getMethods (ReflectionMethod::IS_PUBLIC);

//获取getName方法对象
//ReflectionMethod
//$res = $class->getMethod('getName');
//执行方法
//$res = $res->invoke($instance);

//调用方法示例
$obj = new  Student('张三' ,'33 ,' ,0);
$class = new ReflectionClass($obj);
$instance = $class->newInstance('张三' ,'33 ,' ,0);

//建立方法的反射
$method = new ReflectionMethod("Student" , 'setName');
//调用 setName 这个方法
$res = $method->invokeArgs($instance , array(
    '李四' ,
));
var_dump($res);